package com.tleng.Nodos;

import org.antlr.runtime.Token;
import org.antlr.runtime.tree.CommonTree;


public class NodoSubSuperIndice extends NodoGenerico {

	public NodoSubSuperIndice(Token t) 
	{
		super(t);
	}
	
    public NodoSubSuperIndice(CommonTree node)
    { 
    	super(node); 
    }
    
    public String Imprimir()
    {
    	String e3 = (!E3().EsVacio())? E3().Imprimir() : "";
    	String e4 = (!E4().EsVacio())? E4().Imprimir() : "";
    	
    	return E2().Imprimir() + e3 + e4;
    }
    
    private NodoGenerico E1() { return this; }
    private NodoGenerico E2() { return (NodoGenerico)this.getChild(0); }
    private NodoGenerico E3() { return (NodoGenerico)this.getChild(1); }
    private NodoGenerico E4() { return (NodoGenerico)this.getChild(2); }
    
    /***
    Caso E1 = E2^E3_E4 ( super y subindicie )
    -----------------------------------------

    En este caso tomaremos como superindice a E3 y subindice a E4 y estos 
    pueden estar o no estar para cubrir los 4 casos de la gramatica.

    E2().x = E1().x
    E2().y = E1().y
    E2().escala = E1().escala

    E3().x = E1().x + E2().ancho
    E3().y = E1().y + E2().alto_superior * separacion_super_subindice
    E3().escala = E1().escala * escala_subper_subindice

    E4().x = E1().x + E2().ancho
    E4().y = E1().y - E3().alto * (1 - separacion_super_subindice)
    E4().escala = E1().escala * escala_subper_subindice

    E1().ancho = E2().ancho + Math.max ( E3().ancho, E4().ancho )
    E1().alto_superior = E2().alto_superior * separacion_super_subindice + Math.max ( E3().alto_superior , E2().alto_superior * (1 - separacion_super_subindice)
    E1().alto_inferior = Math.max ( E4().alto_inferior + E4().alto_superior * separacion_super_subindice, E1().alto_inferior)
    
    */
    
    public void calcularX()
    {
    	E2().x = E1().x;
    	if(!E3().EsVacio())
    		E3().x = E1().x + E2().ancho;
    	if(!E4().EsVacio())
    		E4().x = E1().x + E2().ancho;
    	
    	E2().calcularX();
		E3().calcularX();
		E4().calcularX();
    }
    
    public void calcularY()
    {
    	E2().y = E1().y;
		E3().y = E1().y + E2().alto_superior * separacion_super_subindice;
		E4().y = E1().y - E4().altoTotal() * (1 - separacion_super_subindice); // TODO : Aca decia E3.alto 
    	
    	E2().calcularY();
		E3().calcularY();
		E4().calcularY();
    	
    }
    
    public void calcularEscala()
    {
    	E2().escala = E1().escala;
		E3().escala = E1().escala * escala_subper_subindice;
		E4().escala = E1().escala * escala_subper_subindice;
    	
    	E2().calcularEscala();
		E3().calcularEscala();
		E4().calcularEscala();
    	
    }
    
    public void calcularAncho()
    {
    	E2().calcularAncho();
		E3().calcularAncho();
		E4().calcularAncho();
    	
    	double maximo = (!E3().EsVacio() && !E4().EsVacio())
    						? Math.max ( E3().ancho, E4().ancho )
    						: (!E3().EsVacio()) 
    							? E3().ancho
    							: E4().ancho;
    	E1().ancho = E2().ancho + maximo;
    }
    
    public void calcularAlto()
    {
    	E2().calcularAlto();
		E3().calcularAlto();
		E4().calcularAlto();
    	
    	double maximo1 = (!E3().EsVacio())
    						? Math.max ( E3().alto_superior , E2().alto_superior * (1 - separacion_super_subindice))
    						:  E2().alto_superior * (1 - separacion_super_subindice);
    	double maximo2 = (!E4().EsVacio())
    						? Math.max ( E4().alto_inferior + E4().alto_superior * separacion_super_subindice, E1().alto_inferior)
    						: E1().alto_inferior;

    	E1().alto_superior = E2().alto_superior * separacion_super_subindice + maximo1;
    	E1().alto_inferior = maximo2;
    }
}
